// 用两个栈实现一个队列。
// 其中请实现它的两个函数 appendTail 和 deleteHead ，
// 分别完成在队列尾部插入整数和在队列头部删除整数的功能。
// (若队列中没有元素，deleteHead 操作返回 -1 )

// 双栈实现队列
class CQueue {
    protected stack: number[];// 栈用于颠倒数据顺序，负责入
    protected queue: number[];// 正确的队列顺序，负责出
    constructor() {// 构造函数
        this.stack = [];
        this.queue = [];
    }
    // 入栈方法
    public appendTail(value: number): void {
        this.stack.push(value);
    }
    // 出队方法，额外注意！！
    public deleteHead(): number {
        if (this.queue.length < 1 && this.stack.length > 0) {
            while (this.stack.length > 0) {
                this.queue.push(this.stack.pop() as number);
            }
        }
        return this.queue.length > 0 ? this.queue.pop() as number : -1;
    }
}

// 这个题目还是挺考数据结构基础的一道题目
// 单栈是无法实现队列功能，因为栈底元素（对应队首元素）无法直接删除，需要将上方所有元素出栈。
// 但是双栈可实现列表倒序，例如：
// 有含三个元素的栈 A = [1,2,3] 和空栈 B = []。
// 若循环执行 A 元素出栈并添加入栈 B ，
// 直到栈 A 为空，则 A = [], B = [3,2,1]，
// 即 栈 B 元素可实现栈 A 元素倒序。
// 但这里一定要注意的就是实现倒序的时候栈B一定要为空
// 例如sA = [1,2,3], qB = [4],这个时候对A倒叙,qB就会变成 = [4,3,2,1]导致顺序错误
// 只要注意好这个出队的方法基本就不容易错，简单来说就是记住
// 一个栈只负责入，另一个栈只负责出。


